﻿using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
using Dapper;
using SoftLab.Clases;

// ReSharper disable once CheckNamespace
namespace SoftLab.Formularios
{
    public partial class Hemograma : Template.Template
    {
        private int _pacienteId;
        private int _id;
        private List<String> _unidad;
        private List<String> _valor;
        private string[] _nombreUnidad;
        private string[] _arr;
        private static Hemograma _instance;

        public static Hemograma GetInstance()
        {
            if (_instance == null || _instance.IsDisposed)
                _instance = new Hemograma();
            _instance.BringToFront();
            return _instance;
        }

        private Hemograma()
        {
            InitializeComponent();

            //Metodos para inicializar
            Cargar();
            CargarUnidades();
            CargarValoreNormales();
            CargarCampos();

            //Eventos
            #region Close form
            label2.Click += (sender, e) => Close();
            #endregion
            #region ContextMenuLabel
            ContextMenuLabel.Click += (sender, e) => contextMenuStrip1.Show(Cursor.Position.X, Cursor.Position.Y);
            #endregion
            #region contextMenu1
            agregarToolStripMenuItem.Click += (sender, e) =>
            {
                AgregarPaciente();
            };

            buscarToolStripMenuItem.Click += (sender, e) =>
            {
                var buscar = new BuscarPaciente();
                buscar.ShowDialog();
                _pacienteId = buscar.PacienteId;
                BuscarPaciente(_pacienteId);
            };
            #endregion
            #region limpiarButton
            limpiarButton.Click += (sender, e) => CargarCampos();
            #endregion
            #region procesarButton
            procesarButton.Click += (sender, e) => Procesar();
            #endregion

        }

        void Cargar()
        {
            using (var conexion = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
            {
                conexion.Open();
                const string q = "select id, nombre, tipo, unidad, valornormal from analisis where tipo = 'HEMOGRAMA'";
                var query = conexion.Query<Analisis>(q);
                var datos = query.ToList();
                foreach (var a in datos)
                {
                    var lbl = new Label { Text = a.Nombre, Size = new Size(100, 25) };
                    var txt = new TextBox { Name = a.Id.ToString(CultureInfo.InvariantCulture), Size = new Size(100, 25) };
                    flp.Controls.Add(lbl);
                    flp.Controls.Add(txt);
                }
                conexion.Close();
            }
        }

        void CargarUnidades()
        {
            _unidad = new List<string>();
            using (var conexion = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
            {
                conexion.Open();
                const string q = "select unidad from analisis where tipo='HEMOGRAMA'";
                var query = conexion.Query<string>(q);
                _unidad = query.ToList();
                _nombreUnidad = new string[_unidad.ToArray().Length];
                _nombreUnidad = _unidad.ToArray();
                conexion.Close();
            }
        }

        void CargarValoreNormales()
        {
            _valor = new List<string>();
            using (var conexion = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
            {
                conexion.Open();
                const string q = "select valornormal from analisis where tipo='HEMOGRAMA'";
                var query = conexion.Query<string>(q);
                _valor = query.ToList();
                _arr = _valor.ToArray();
                conexion.Close();
            }
        }

        void CargarCampos()
        {
            foreach (var control in flp.Controls.OfType<TextBox>())
            {
                control.Text = "-";
            }
            foreach (var control in groupBox1.Controls.OfType<TextBox>())
            {
                control.Text = "-";
            }
        }

        void AgregarPaciente()
        {
            var agregar = new AgregarPaciente();
            agregar.ShowDialog();
            _pacienteId = agregar.PacienteId;
            pacienteText.Text = agregar.NombrePaciente;
        }

        void BuscarPaciente(int paciente)
        {
            if (paciente != 0)
            {
                using (var conexion = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
                {
                    conexion.Open();
                    var q = "select id, nombre, apellido from pacientes where id=@Id";
                    var query = conexion.Query<Clases.Pacientes>(q, new { Id = paciente });
                    var pacientes = query.ToList().First();
                    pacienteText.Text = pacientes.Nombre + " " + pacientes.Apellido;
                    _pacienteId = pacientes.Id;
                    conexion.Close();
                }
            }
        }

        void Procesar()
        {
            using (var conexion = new SQLiteConnection(Properties.Settings.Default.ConnectionString))
            {
                conexion.Open();
                var usr = new SaveUser();
                var evaluacion = new Evaluacion
                {
                    PacienteId = _pacienteId.ToString(CultureInfo.InvariantCulture),
                    Fecha = DateTime.Now.ToShortDateString(),
                    Hora = DateTime.Now.ToShortTimeString(),
                    UserId = usr.User,
                    Indicacion = doctorText.Text
                };

                var sql =
                    "insert into evaluacion(pacienteid, fecha, hora, userid, indicacion) values(@PacienteId,@Fecha,@Hora,@UserId,@Indicacion)";
                conexion.Execute(sql, evaluacion);
                _id = conexion.Query<int>("select last_insert_rowid()").First();
                var liststring = new List<String>();
                var i = 0;
                foreach (Control control in flp.Controls)
                {
                    if (!(control is TextBox)) continue;
                    var sqlstring = control.Text != "" ?
                        "insert into detalle_evaluacion(evaluacionid, analisisid, unidad, valor1, valor2, valor3, valornormal) "
                        + "values(" + _id + ",'" + control.Name + "','" + _nombreUnidad[i] + "','" + control.Text + "','-','-','" + _arr[i] + "')" : "";
                    liststring.Add(sqlstring);
                    i++;
                }

                foreach (var s in liststring)
                {
                    if (s != null)
                        conexion.Execute(s);
                }
                MessageBox.Show("Procesado correctamente");
                CargarCampos();
                conexion.Close();
            }
        }
    }
}
